package com.second.app.forkjoin;


import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
 * @Author GYZ
 * @Date 2024/2/5
 * <pre>
 * 分治编程与类结构
 *  工作窃取：指某个线程从其他队列里窃取任务来执行：
 *  比如要完成一个比较大的任务，完全可以把这个大的任务分割为若干不互依赖的子任务、小任务。把这些子任务放到不同的队列里，这时候就会出现
 *  有的线程会先把自己队列里的任务快速执行完毕，而其他对应的队列里还有其他任务等待处理，完成任务的线程与其等着，不如帮助其他线程分担要执行的任务
 *  ，于是就去其他线程窃取一个任务来执行，这就是所谓的（work-stealing）算法
 * </pre>
 */
class CustomRecursiveAction extends RecursiveAction {

    private final int beginValue;

    private final int endValue;

    public CustomRecursiveAction(int beginValue, int endValue) {
        this.beginValue = beginValue;
        this.endValue = endValue;
    }

    @Override
    protected void compute() {
        System.out.println(Thread.currentThread().getName() + " --------");
        if (endValue - beginValue > 2) {
            int middleNum = (beginValue + endValue) / 2;
            CustomRecursiveAction leftAction = new CustomRecursiveAction(beginValue, middleNum);
            CustomRecursiveAction rightAction = new CustomRecursiveAction(middleNum + 1, endValue);
            invokeAll(leftAction,rightAction);
        }else{
            System.out.println("打印组合为："+beginValue+"-"+endValue);
        }
    }
}

public class ForkJoinRun {

    public static void main(String[] args) throws InterruptedException {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        forkJoinPool.submit(new CustomRecursiveAction(1, 10));
        Thread.sleep(5000);
    }
}

